home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-ROM Collection / Amiga CD-ROM Collection - Auge 4000 and Cactus and Demo Util.iso / auge4000 / 46 / lib / amiga / divu.a < prev    next >
Text File  |  1990-06-20  |  1KB  |  67 lines

  1.  
  2.         section text,code
  3.  
  4.         xdef    __divu
  5.  
  6. __divu:
  7.         move.l    D2,-(sp)
  8.  
  9.         cmp.l    D0,D1        ; carry on D0 > D1 (D1 / D0 == 0)
  10.         bcc    mq0
  11.         moveq.l #0,D0        ; D1 = D1, D0 = 0
  12.         move.l    (sp)+,D2
  13.         rts
  14.  
  15. mq0        swap    D0        ; denominator 16 bits?
  16.         tst.w    D0
  17.         bne    mq90
  18.         swap    D0        ; yes, 32/16 -> 32, try divu
  19.         move.l    D1,D2
  20.         divu    D0,D2        ; D2 = rem|res
  21.         bvs    md0        ; overflow, go slow
  22.         move.l    D2,D1
  23.         clr.w    D1
  24.         swap    D1        ; D1 = rem
  25.         move.l    D2,D0
  26.         swap    D0
  27.         clr.w    D0
  28.         swap    D0        ; D0 = result
  29.         move.l    (sp)+,D2
  30.         rts
  31.  
  32. mq90        swap    D0
  33.  
  34. md0        move.l    D3,-(sp)
  35.         move.l    D4,-(sp)
  36.  
  37.         moveq.l #0,D3
  38.         moveq.l #0,D4        ; result
  39.         move.l    D0,D2        ; D2 = D0
  40. md1        addq.l    #1,D3
  41.         asl.l    #1,D2
  42.         bcs    md2
  43.         cmp.l    D1,D2        ; loop while D2 <= D1
  44.         bls    md1
  45. md2        roxr.l    #1,D2        ; overflow or went over, get prev D2
  46.         subq.l    #1,D3
  47. md3        sub.l    D2,D1        ; and subtract
  48.         bset.l    D3,D4        ; set bit in result (n)
  49. md4        subq.l    #1,D3
  50.         bcs    md10
  51.         lsr.l    #1,D2
  52.         cmp.l    D1,D2        ; D2 - D1, bcs D1 > D2
  53.         bls    md3        ;           bls D1 >= D2
  54.         bra    md4
  55. md10
  56.         ;   result in D4, remainder in D1
  57.  
  58.         move.l    D4,D0
  59.  
  60.         move.l    (sp)+,D4
  61.         move.l    (sp)+,D3
  62.         move.l    (sp)+,D2
  63.         rts
  64.  
  65.         END
  66.  
  67.